<?php

namespace app\admin\controller\setting;

use app\admin\controller\Controller;
use app\common\model\Setting as SettingModel;
use think\facade\Cache as FacadeCache;
use think\facade\Env;

/**
 * 清理缓存
 * Class Index
 * @package app\admin\controller
 */
class Cache extends Controller
{
    /**
     * 缓存列表
     * @return array
     */
    public function list(){
        $model = new SettingModel;
        return $this->renderSuccess($model->getItem('cache'));
    }

    /**
     * 清理缓存
     * @param bool $chacheList
     * @return mixed
     */
    public function clear()
    {
        $chacheList = $this->request->param('checkList');
        // $chacheList = ['menus'=>'menus','roles'=>[1,2]];
        if(is_array($chacheList))
        {
            foreach ($chacheList as $key => $value) {
                # code...
                if($value)
                {
                    $this->clearCache($key,$value);
                }
            }
        }else
        {
            if(Env('cache.type') == 'file')
            {
                // 删除所有缓存
                $this->deleteFolder(app()->getAppPath() . '\/cache/');
            }else
            {
                // 清空缓存池
                FacadeCache::clear();
            }
        }
        return $this->renderSuccess('','清除成功!');
    }

    
    /**
     * 删除指定缓存
     * @param $key 缓存关键字
     * @param $data 子列表关键字
     * @return bool
     */
    private function clearCache($key,$data = []){
        switch ($key) {
            case 'all':
                if(Env('cache.type') == 'file')
                {
                    // 删除所有缓存
                    $this->deleteFolder(app()->getAppPath() . '\/cache/');
                }
                else
                {
                    // 清空缓存池
                    FacadeCache::clear();
                }
                break;
            case 'role':
                // 删除缓存
                foreach ($data as $key => $value) {
                    // 删除对应关键字缓存
                    FacadeCache::delete('menus_'.$value);
                    FacadeCache::delete('admin_authority_menu_url_'.$value);
                }
                break;
            default:
                // 删除对应关键字缓存
                FacadeCache::delete($key);
                break;
        }
        
    }

    /**
     * 递归删除指定目录下所有文件
     * @param $path
     * @return bool
     */
    private function deleteFolder($path)
    {
        if (!is_dir($path))
            return false;
        // 扫描一个文件夹内的所有文件夹和文件
        foreach (scandir($path) as $val) {
            // 排除目录中的.和..
            if (!in_array($val, ['.', '..', '.gitignore'])) {
                // 如果是目录则递归子目录，继续操作
                if (is_dir($path . $val)) {
                    // 子目录中操作删除文件夹和文件
                    $this->deleteFolder($path . $val . '/');
                    // 目录清空后删除空文件夹
                    rmdir($path . $val . '/');
                } else {
                    // 如果是文件直接删除
                    unlink($path . $val);
                }
            }
        }
        return true;
    }

}
